<!DOCTYPE html>
<html>
<!--
Copyright 2008 The Closure Library Authors. All Rights Reserved.

Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Closure Unit Tests - goog.locale.timeZoneDetection</title>
  <script src='../base.js'>
  </script>
  <script>
  goog.require('goog.locale.TimeZoneFingerprint');
  goog.require('goog.locale.timeZoneDetection');
  goog.require('goog.testing.jsunit');
  </script>
</head>
<body>
<script>

  /**
   * Mock date class with simplified properties of Date class for testing.
   * @constructor
   */
  function MockDate() {
    /**
     * Time zone offset. For time zones with daylight saving, the different
     * offsets are represented as array of offsets.
     * @type {Array.<number>}
     * @private
     */
    this.timezoneOffset_ = [];
    /**
     * Counter storing the index of next offset value to be returned from the
     * array of offset values. 
     * @type {number}
     * @private
     */
    this.offsetArrayCounter_ = 0;
  }

  /**
   * Does nothing because setting the time to calculate offset is not needed
   * in the mock class.
   * @param {number} ms Ignored.
   */
  MockDate.prototype.setTime = function(ms) {
    // Do nothing.
  };

  /**
   * Sets the time zone offset.
   * @param {Array.<number>} offset Time zone offset.
   */
  MockDate.prototype.setTimezoneOffset = function(offset) {
    this.timezoneOffset_ = offset;
  };

  /**
   * Returns consecutive offsets from array of time zone offsets on each call.
   * @return {number} Time zone offset.
   */
  MockDate.prototype.getTimezoneOffset = function() {
    return this.timezoneOffset_.length > 1 ?
        this.timezoneOffset_[this.offsetArrayCounter_++] :
        this.timezoneOffset_[0];
  };

  function testGetFingerprint() {
    var mockDate = new MockDate();
    mockDate.setTimezoneOffset([-480]);
    var fingerprint = goog.locale.timeZoneDetection.getFingerprint(mockDate);
    assertEquals(32, fingerprint);

    mockDate = new MockDate();
    mockDate.setTimezoneOffset(
        [480, 420, 420, 480, 480, 420, 420, 420, 420, 420, 420, 420, 420]);
    fingerprint = goog.locale.timeZoneDetection.getFingerprint(mockDate);
    assertEquals(1294772902, fingerprint);
  }

  function testDetectTimeZone() {
    var mockDate = new MockDate();
    mockDate.setTimezoneOffset([-480]);
    var timeZoneId =
        goog.locale.timeZoneDetection.detectTimeZone(undefined, mockDate);
    assertEquals('Asia/Hong_Kong', timeZoneId);

    mockDate = new MockDate();
    mockDate.setTimezoneOffset(
        [480, 420, 420, 480, 480, 420, 420, 420, 420, 420, 420, 420, 420]);
    timeZoneId = goog.locale.timeZoneDetection.detectTimeZone('US', mockDate);
    assertEquals('America/Los_Angeles', timeZoneId);

    mockDate = new MockDate();
    mockDate.setTimezoneOffset(
        [480, 420, 420, 480, 480, 420, 420, 420, 420, 420, 420, 420, 420]);
    timeZoneId = goog.locale.timeZoneDetection.detectTimeZone('CA', mockDate);
    assertEquals('America/Dawson', timeZoneId);
  }

  function testGetTimeZoneList() {
    var mockDate = new MockDate();
    mockDate.setTimezoneOffset(
        [480, 420, 420, 480, 480, 420, 420, 420, 420, 420, 420, 420, 420]);
    var timeZoneList =
         goog.locale.timeZoneDetection.getTimeZoneList(undefined, mockDate);
    assertEquals('America/Los_Angeles', timeZoneList[0]);
    assertEquals('America/Whitehorse', timeZoneList[4]);
    assertEquals(5, timeZoneList.length);

    mockDate = new MockDate();
    mockDate.setTimezoneOffset([-480]);
    timeZoneList =
        goog.locale.timeZoneDetection.getTimeZoneList(undefined, mockDate);
    assertEquals('Asia/Hong_Kong', timeZoneList[0]);
    assertEquals('Asia/Chongqing', timeZoneList[7]);
    assertEquals(16, timeZoneList.length);

    timeZoneList =
        goog.locale.timeZoneDetection.getTimeZoneList('AU', mockDate);
    assertEquals(1, timeZoneList.length);
    assertEquals('Australia/Perth', timeZoneList[0]);
  }

</script>
</body>
</html>
